"""
    配置相关模块
"""
import json
import os
import yaml

__all__ = ['read_from_local_config']


def read_from_local_config():
    dir_path = os.path.abspath(os.path.dirname(__file__))
    dir_path = dir_path + "/local_config.yaml"
    with open(dir_path, 'r', encoding='UTF-8') as fr:
        temp = yaml.load(fr, Loader=yaml.FullLoader)
        return temp


def get_root_path():
    # project root dir 项目的根路径
    _curPath = os.path.abspath(os.path.dirname(__file__))
    root_path = _curPath[:_curPath.find("/keystone_common/")]
    return root_path


def read_from_server_config(env, server_ip="10.111.33.6", user="centos", password="V1p3r1@#$%", port=52222, mode="mt"):
    """
        从远程服务器上读取环境配置，采取ssh的方式，主要是ksr, kg, viper集群的ip地址
    :param server_ip:  server地址,这里默认是跳板机，
    :param user:  用户名
    :param password:  密码
    :param env:   环境，按一定规则保存环境变量配置的，这里一般是"KSx"，x为具体的一个数字，如：ks3。
    :param port: 默认为 22
    :param str mode: 环境部署模式，取值范围：mt, city, st
    :return:
    """
    return {}


def get_config_with_sep_env():
    """
        用于读取配置config，
        在sep平台上运行时，从sep平台传进来的config，也是从系统的env中读取config。
        本地运行时，从local_config.yml中读取。
    :return:
    """
    config = read_from_local_config()

    # 读取运行的环境中的环境变量
    sep_sys_config = os.environ.get("config")
    if sep_sys_config:
        sep_sys_config = json.loads(sep_sys_config)
        if config.get('sep_flag') is None:
            config.update({'sep_flag': True})
        config.update(sep_sys_config)

    # 根据env,将env对应的值更新整个config，如果开启从server端读取，则从server端读取并覆盖
    def merge_env_config(c):
        e = c.get('env')
        if e and e in c and isinstance(c.get(e), dict):
            config.update(c.get(e))  # 用e对应的配置更新整个config
        if (e and e not in ['dev', 'lite']) and \
                (c.get('server_config_flag') and c.get('config_server_host')):
            cfg = read_from_server_config(e, server_ip=c.get('config_server_host'))
            if cfg and isinstance(cfg, dict):
                config.update(cfg)  # 从服务端读取的来更新整个config

    merge_env_config(config)

    # 本地的素材路径
    local_data_flag = config.get('local_data_flag')
    if local_data_flag:
        config.update({"data_path": get_root_path() + "/material"})

    return config


# 将全局配置变量作为一个值用
G_CONFIG = get_config_with_sep_env()

if __name__ == "__main__":
    # G_CONFIG = get_config_with_sep_env()
    print(json.dumps(G_CONFIG))
